"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/6/3 9:58
@Description :   python高阶 闭包的使用
实现数据的累加
"""
# 全局变量
total = 0

def sum_data(*args):
    """
         # 局部变量
        total = 20
        # 函数内访问全局变量total    局部变量和全局变量重名时  局部变量优先级较高
        print(total)
    """
    global total  # 在局部需要改变全局变量时 需要 先声明
    for num in args:
        total += num  # 局部可以直接使用全局变量 但是不能直接修改全局变量


def sum_new(*args):
    """
        阻止用户直接改变total的途径 但是无法实现累加效果
    """
    total = 0
    for num in args:
        total += num
    print(total)


#  python中提供了一个闭包的语法  可以解决以上问题

"""
闭包定义:
在函数嵌套的前提下，内部函数使用了外部函数的变量，并且外部函数返回了内部函数，我们把这个使用了外部变量的内部函数叫做闭包

弊端:
   在外部函数中定义的变量在内存中得不到及时的释放   变量比较多的时候 会占用大量的空间
"""


def sum_out():
    # 局部变量
    total1 = 0
    def sum_inner(*args):
        print('-------------sum_inner--------------')
        # 内部函数中使用外部函数中定义的变量
        nonlocal total1  # 内部函数中需要改变为外部函数中定义的变量 需要声明
        for num in args:
            total1 += num
        return total1

    return sum_inner


if __name__ == '__main__':
    """
        print(total)
        sum_data(1, 2, 3)
        print(total)
        sum_data(1, 2, 3)
        #  随时改变全局变量的值 导致数据处理存在安全性问题
        total = 10
        print(total)
        
        sum_new(1, 2, 3)
        sum_new(1, 2, 3)
    """
    fn = sum_out()  # sum_inner
    sum_result = fn(1, 2, 3)  # 调用函数
    print(sum_result)
    sum_result = fn(1, 2, 3)
    print(sum_result)
